package com.jay.proxy;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Mock 服务代理（JDK 动态代理）
 * 该类的主要作用是创建一个代理对象，该对象可以模拟真实对象的行为
 * 主要用于测试环境中，当真实服务不可用或不需要调用时，使用此代理对象返回默认值
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {

    /**
     * 调用代理
     * 当通过代理对象调用方法时，该方法会被调用
     * 它负责根据被调用方法的返回类型，生成一个默认的返回值
     *
     * @param proxy 代理对象
     * @param method 被调用的方法对象
     * @param args 方法参数
     * @return 方法的默认返回值
     * @throws Throwable 如果方法调用过程中出现异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 根据方法的返回值类型，生成特定的默认值对象
        Class<?> methodReturnType = method.getReturnType();
        // 记录日志，指示正在模拟调用的方法名称
        log.info("mock invoke {}", method.getName());
        // 返回根据方法返回类型获取的默认值
        return getDefaultObject(methodReturnType);
    }

    /**
     * 生成指定类型的默认值对象（可自行完善默认值逻辑）
     * 根据传入的类型参数，决定返回相应的默认值
     * 目前仅实现了基本类型的默认值返回，对于复杂类型需要自行扩展
     *
     * @param type 需要生成默认值的类型
     * @return 指定类型的默认值对象
     */
    private Object getDefaultObject(Class<?> type) {
        // 基本类型
        if (type.isPrimitive()) {
            // 根据不同的基本类型返回相应的默认值
            if (type == boolean.class) {
                return false;
            } else if (type == short.class) {
                return (short) 0;
            } else if (type == int.class) {
                return 0;
            } else if (type == long.class) {
                return 0L;
            }
        }
        // 对象类型
        // 对于非基本类型，目前返回null，未来可根据需要扩展
        return null;
    }
}
